#include "Hardware/1-wire.h"
#include "Hardware/Timer.h"
#include "Common/BitOpr.h"

#define DevicePort P2
#define DeviceBit  2

#define DQ(x) ( (!!(x))?SetBit(DevicePort,DeviceBit) : ClrBit(DevicePort,DeviceBit) );Delay1us()  //置

bool WireReset()
{
	bool haveDevice=false; //是否有设备
	
	DQ(1); //释放总线
	
	//复位操作
	DQ(0);
	Delay550us(); 
	DQ(1);
	Delay60us(); //等待60 准备采样
	
	if(GetBit(DevicePort,DeviceBit)==0)
		haveDevice=true;
	Delay550us(); //等待复位结束
	DQ(1); //释放总线
	return haveDevice;
}

bit WireGetBit()
{
	//读时序,将总线拉低后15us内释放,一个读时序过程至少60us完成
	bit res;
	DQ(0);//拉低
	DQ(1);//15us内释放
	res=GetBit(DevicePort,DeviceBit); //读总线数据
	Delay60us(); //维持60us
	DQ(1); //释放
	return res;
}

byte WireRecvByte()
{
	byte res=0;
	uint8 i;
	bit tmp;
	for(i=0;i<sizeof(byte)*8;++i)
	{
		tmp=WireGetBit();
		if(tmp)
			SetBit(res,i);
	}
	return res;
}

void WireSendBit(bit dat)
{
	//写时序,写0时,总线至少被拉低60us,写1时,总线被拉低后,15us就必须释放总线
	
	DQ(0);
	
	if(dat) //写1
	{
		Delay1us();
		Delay1us();
		Delay1us();
		Delay1us();
	}
	else //写0
	{
		Delay60us();
	}
	
	DQ(1); //释放总线
}

void WireSendByte(byte dat)
{
	uint8 i;
	for(i=0;i<sizeof(byte)*8;++i)
	{
		WireSendBit(GetBit(dat,i));
	}
}

